﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ModeloMagiPack.Entidades;
using BLLMagiPack.Managers;
using System.IO;
using MaGiPack.ModeloPresentacion;
using MaGiPack.Facturacion;

namespace MaGiPack.Fabricacion
{
    public partial class FrmOrdenFabricacion : Form
    {
        #region Inicialización
        private OrdenCompleta _ordenCompleta;
        private bool _editando;
        private bool _duplicando;

        public FrmOrdenFabricacion(OrdenCompleta ordenCompleta)
        {
            InitializeComponent();
            _ordenCompleta = ordenCompleta;
            Text = "Editando Orden de fabricación";
            _editando = true;
        }

        public FrmOrdenFabricacion()
        {
            InitializeComponent();
            Text = "Nueva Orden de fabricación";
            _duplicando = _editando = false;
            _ordenCompleta = new OrdenCompleta();
        }


        private bool ValidarDatos()
        {
            StringBuilder sumario = new StringBuilder();

            if (cboCliente.SelectedIndex == 0)
                sumario.AppendLine("- Es necesario seleccionar un cliente.");
            if (cboModeloCaja.SelectedIndex == 0)
                sumario.AppendLine("- Es necesario seleccionar un modelo de caja.");

            if (sumario.Length > 0)
                MessageBox.Show(sumario.ToString(), "DATOS INCOMPLETOS", MessageBoxButtons.OK, MessageBoxIcon.Error);

            return sumario.Length == 0;
        }

        private void LeerDatosOrden(BLLOrden bllOrden)
        {
            _ordenCompleta.Orden.IdCliente = (cboCliente.SelectedIndex > 0) ? (cboCliente.SelectedItem as Cliente).IdCliente : null;
            _ordenCompleta.Orden.LugarEntrega = txtLugarEntrega.Text;
            _ordenCompleta.Orden.Fecha = dtpFecha.Value;
            _ordenCompleta.Orden.CompraM2 = (txtPrecioVenta.TextLength > 0) ? decimal.Parse(txtPrecioVenta.Text, Utilidades.Cultura) : 0;
            _ordenCompleta.Orden.ComisionVendedor = (txtComisionVendedor.TextLength > 0) ? decimal.Parse(txtComisionVendedor.Text, Utilidades.Cultura) : 0;
            _ordenCompleta.Orden.IdModeloCaja = (cboModeloCaja.SelectedIndex > 0) ? (cboModeloCaja.SelectedItem as ModeloCaja).IdModeloCaja : null;

            _ordenCompleta.Caja.CajaPara = txtCajaPara.Text;
            _ordenCompleta.Caja.Formato = txtFormato.Text;
            _ordenCompleta.Caja.Colores = txtColores.Text;
            _ordenCompleta.Caja.OrdenCompra = txtOrdenDeCompra.Text;
            _ordenCompleta.Caja.Cantidad = (txtCantidad.TextLength > 0) ? int.Parse(txtCantidad.Text, Utilidades.Cultura) : 0;
            _ordenCompleta.Caja.Clise = (txtClise.TextLength > 0) ? decimal.Parse(txtClise.Text, Utilidades.Cultura) : 0;
            _ordenCompleta.Orden.CompraM2 = (txtPrecioVenta.TextLength > 0) ? decimal.Parse(txtPrecioVenta.Text, Utilidades.Cultura) : 0;

            _ordenCompleta.Complementos.PisosCantidad = (txtPisosCantidad.TextLength > 0) ? int.Parse(txtPisosCantidad.Text, Utilidades.Cultura) : 0;
            _ordenCompleta.Complementos.PisosSuperficie = (txtPisosSuperficie.TextLength > 0) ? decimal.Parse(txtPisosSuperficie.Text, Utilidades.Cultura) : 0;
            _ordenCompleta.Complementos.PisosPrecio = (txtPisosPrecio.TextLength > 0) ? decimal.Parse(txtPisosPrecio.Text, Utilidades.Cultura) : 0;
            _ordenCompleta.Complementos.CercosCantidad = (txtCercosCantidad.TextLength > 0) ? int.Parse(txtCercosCantidad.Text, Utilidades.Cultura) : 0;
            _ordenCompleta.Complementos.CercosPrecio = (txtCercosPrecio.TextLength > 0) ? decimal.Parse(txtCercosPrecio.Text, Utilidades.Cultura) : 0;
            _ordenCompleta.Complementos.CercosSuperficie = (txtCercosSuperficie.TextLength > 0) ? decimal.Parse(txtCercosSuperficie.Text, Utilidades.Cultura) : 0;
            _ordenCompleta.Complementos.DivisionesCantidad = (txtDivisionesCantidad.TextLength > 0) ? int.Parse(txtDivisionesCantidad.Text, Utilidades.Cultura) : 0;
            _ordenCompleta.Complementos.DivisionesPrecio = (txtDivisionesPrecio.TextLength > 0) ? decimal.Parse(txtDivisionesPrecio.Text, Utilidades.Cultura) : 0;
            _ordenCompleta.Complementos.DivisionesSuperficie = (txtDivisionesSuperficie.TextLength > 0) ? decimal.Parse(txtDivisionesSuperficie.Text, Utilidades.Cultura) : 0;

            if (rdoUtilizarImagen.Checked)
            {
                if (ofdDiseñoFoto.FileName != string.Empty)
                    _ordenCompleta.Diseño.ArchivoFoto = bllOrden.GuardarImagen(ofdDiseñoFoto.FileName);
            }
            else
                _ordenCompleta.Diseño.ArchivoFoto = null;

            _ordenCompleta.Caja.Precio = (txtCompraM2.TextLength > 0) ? decimal.Parse(txtCompraM2.Text, Utilidades.Cultura) : 0;
            _ordenCompleta.Orden.IdVendedor = (cboVendedores.SelectedIndex > 0) ? (cboVendedores.SelectedItem as Vendedor).IdVendedor : null;
            _ordenCompleta.Orden.ComisionVendedor = (txtComisionVendedor.TextLength > 0) ? decimal.Parse(txtComisionVendedor.Text, Utilidades.Cultura) : 0;
        }

        private void GuardarOrden()
        {
            if (!ValidarDatos())
                return;

            BLLOrden bllOrden = new BLLOrden();
            LeerDatosOrden(bllOrden);

            string accion = " modificado ";

            if (_editando)
                bllOrden.ModificarOrden(_ordenCompleta);
            else
            {
                accion = " guardado ";
                bllOrden.CargarOrden(_ordenCompleta);
                Close();
            }
            
            if (_duplicando)
                MessageBox.Show("Se ha creado una nueva orden con el N° " + _ordenCompleta.Orden.IdOrden, "AVISO", MessageBoxButtons.OK, MessageBoxIcon.Information);
            else
                MessageBox.Show(string.Format("La orden se ha {0} con éxito", accion), "AVISO", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

        private void CargarDatos()
        {
            cboCliente.Text = new BLLCliente().TraerCliente(_ordenCompleta.Orden.IdCliente).Nombre;
            txtLugarEntrega.Text = _ordenCompleta.Orden.LugarEntrega;
            cboCondicionesVenta.Text = new BLLCondicionVenta().TraerCondicion(_ordenCompleta.Orden.IdCondicionVenta).Nombre;

            cboModeloCaja.Text = new BLLModeloCaja().TraerModeloCaja(_ordenCompleta.Orden.IdModeloCaja).Codigo;
            txtCajaPara.Text = _ordenCompleta.Caja.CajaPara;
            txtFormato.Text = _ordenCompleta.Caja.Formato;
            txtColores.Text = _ordenCompleta.Caja.Colores;
            txtOrdenDeCompra.Text = _ordenCompleta.Caja.OrdenCompra;
            txtCantidad.Text = _ordenCompleta.Caja.Cantidad.ToString(Utilidades.Cultura);
            txtClise.Text = _ordenCompleta.Caja.Clise.ToString(Utilidades.Cultura);
            txtCompraM2.Text = _ordenCompleta.Orden.CompraM2.ToString(Utilidades.Cultura);

            txtPisosCantidad.Text = _ordenCompleta.Complementos.PisosCantidad.ToString(Utilidades.Cultura);
            txtPisosPrecio.Text = _ordenCompleta.Complementos.PisosPrecio.ToString(Utilidades.Cultura);
            txtPisosSuperficie.Text = _ordenCompleta.Complementos.PisosSuperficie.ToString(Utilidades.Cultura);
            txtDivisionesCantidad.Text = _ordenCompleta.Complementos.DivisionesCantidad.ToString(Utilidades.Cultura);
            txtDivisionesPrecio.Text = _ordenCompleta.Complementos.DivisionesPrecio.ToString(Utilidades.Cultura);
            txtDivisionesSuperficie.Text = _ordenCompleta.Complementos.DivisionesSuperficie.ToString(Utilidades.Cultura);
            txtCercosCantidad.Text = _ordenCompleta.Complementos.CercosCantidad.ToString(Utilidades.Cultura);
            txtCercosPrecio.Text = _ordenCompleta.Complementos.CercosPrecio.ToString(Utilidades.Cultura);
            txtCercosSuperficie.Text = _ordenCompleta.Complementos.CercosSuperficie.ToString(Utilidades.Cultura);

            if (_ordenCompleta.Diseño.ArchivoFoto == null)
                rdoUtilizarTextoPersonalizado.Checked = true;
            else
            {
                rdoUtilizarImagen.Checked = true;

                string archivoFoto = new BLLOrden().CarpetaFotos + _ordenCompleta.Diseño.ArchivoFoto;
                if(File.Exists(archivoFoto))
                    picImagenDiseñoCaja.ImageLocation = archivoFoto;
            }

            txtPrecioVenta.Text = _ordenCompleta.Caja.Precio.ToString(Utilidades.Cultura);
            cboVendedores.Text = new BLLVendedor().TraerVendedor(_ordenCompleta.Orden.IdVendedor).Nombre;
            txtComisionVendedor.Text = _ordenCompleta.Orden.ComisionVendedor.ToString(Utilidades.Cultura);

            ActualizarCalculos(null, null);
        }


        private void FrmOrdenFabricacion_Load(object sender, EventArgs e)
        {
            CargarClientes();
            CargarCondicionesVenta();
            CargarModeloCajas();
            CargarVendedores();

            if (_editando)
            {
                CargarDatos();
                CargarFacturacionProveedores();
                CargarFacturacionCliente();
            }
            else
            {
                gbFacturacionProveedoresCalculos.Enabled = gbFacturasProveedores.Enabled = false;
                gbFacturacionClienteCalculos.Enabled = gbFacturasCliente.Enabled = false;
            }
        }

        private void btnGuardar_Click(object sender, EventArgs e)
        {
            _duplicando = false;
            GuardarOrden();
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("Se perderán los datos no guardados. ¿Cerrar?", "PREGUNTA", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                Close();
        }

        private void btnGuardarComo_Click(object sender, EventArgs e)
        {
            _editando = false;
            _duplicando = true;
            GuardarOrden();
        }

        #endregion

        #region Cálculos

        private void ActualizarCalculos(object sender, EventArgs e)
        {
            CalcularSuperficie();
            CalcularPrecioVenta();
            CalcularCPLancha();
            CalcularCompraComplemento();
            CalcularVentaComplemento();
            CalcularValorVentaComplemento();
            CalcularValCompra();
            CalcularValVenta();
            CalcularRestaOResultadoFinal();
            CalcularComisionVendedor();
        }

        private void CalcularSuperficie()
        {
            txtSuperficie.Text = BLLOrden.CalcularSuperficie(txtMedidasDePlancha.Text).ToString("N4", Utilidades.Cultura);
        }

        private void CalcularPrecioVenta()
        {
            decimal precio = 0;
            decimal superficie = 0;

            if (decimal.TryParse(txtCompraM2.Text, out precio) && decimal.TryParse(txtSuperficie.Text, out superficie))
                txtPrecioVtaM2.Text = (precio / superficie).ToString("N3", Utilidades.Cultura);
            else
                txtPrecioVtaM2.Text = string.Empty;
        }

        private void CalcularCPLancha()
        {
            decimal superficie = 0;
            decimal compraM2 = 0;

            if (decimal.TryParse(txtSuperficie.Text, out superficie) && decimal.TryParse(txtPrecioVenta.Text, out compraM2))
                txtCPlancha.Text = (superficie * compraM2).ToString("N2", Utilidades.Cultura);
            else
                txtCPlancha.Text = string.Empty;
        }

        private void CalcularValCompra()
        {
            int cantidad = (txtCantidad.TextLength > 0) ? int.Parse(txtCantidad.Text) : 0;
            decimal compraM2 = 0;
            decimal superficie = 0;

            if (decimal.TryParse(txtSuperficie.Text, out superficie) && decimal.TryParse(txtPrecioVenta.Text, out compraM2))
                txtValorCompram2.Text = (cantidad * compraM2 * superficie).ToString("N2", Utilidades.Cultura);
            else
                txtValorCompram2.Text = string.Empty;
        }

        private void CalcularValVenta()
        {
            decimal precio = 0;
            decimal cantidad = 0;

            if (decimal.TryParse(txtCompraM2.Text, out precio) && decimal.TryParse(txtCantidad.Text, out cantidad))
                txtValorVentaCompram2.Text = (precio * cantidad).ToString("N2", Utilidades.Cultura);
            else
                txtValorVentaCompram2.Text = string.Empty;
        }

        private void CalcularCompraComplemento()
        {
            int pisosCantidad = 0;
            int cercosCantidad = 0;
            int divisionesCantidad = 0;
            decimal pisosPrecio = 0;
            decimal cercosPrecio = 0;
            decimal divisionesPrecio = 0;
            decimal precioVenta = 0;

            bool puta = int.TryParse(txtPisosCantidad.Text, out pisosCantidad)
                     && decimal.TryParse(txtPisosPrecio.Text, out pisosPrecio)
                     && int.TryParse(txtCercosCantidad.Text, out cercosCantidad)
                     && decimal.TryParse(txtCercosPrecio.Text, out cercosPrecio)
                     && int.TryParse(txtDivisionesCantidad.Text, out divisionesCantidad)
                     && decimal.TryParse(txtDivisionesPrecio.Text, out divisionesPrecio)
                     && decimal.TryParse(txtPrecioVtaM2.Text, out precioVenta);

            if (puta)
                txtValorCompraComplemento.Text = (precioVenta * (pisosCantidad * pisosPrecio + cercosCantidad * cercosPrecio + divisionesCantidad * divisionesPrecio)).ToString("N3", Utilidades.Cultura);
        }

        private void CalcularVentaComplemento()
        {
            int pisosCantidad = 0;
            int cercosCantidad = 0;
            int divisionesCantidad = 0;
            decimal pisosPrecio = 0;
            decimal cercosPrecio = 0;
            decimal divisionesPrecio = 0;

            bool puta = int.TryParse(txtPisosCantidad.Text, out pisosCantidad)
                     && decimal.TryParse(txtPisosPrecio.Text, out pisosPrecio)
                     && int.TryParse(txtCercosCantidad.Text, out cercosCantidad)
                     && decimal.TryParse(txtCercosPrecio.Text, out cercosPrecio)
                     && int.TryParse(txtDivisionesCantidad.Text, out divisionesCantidad)
                     && decimal.TryParse(txtDivisionesPrecio.Text, out divisionesPrecio);

            if (puta)
                txtValorVentaComplemento.Text = (pisosCantidad * pisosPrecio + cercosCantidad * cercosPrecio + divisionesCantidad * divisionesPrecio).ToString("N3", Utilidades.Cultura);
        }

        private void CalcularRestaOResultadoFinal()
        {
            decimal valorVenta = 0;
            decimal valorCompra = 0;

            if (decimal.TryParse(txtValorVentaCompram2.Text, out valorVenta) && decimal.TryParse(txtValorCompram2.Text, out valorCompra))
                txtRestaCompra.Text = (valorVenta - valorCompra).ToString("N2", Utilidades.Cultura);
            else
                txtRestaCompra.Text = string.Empty;
        }

        private void CalcularValorVentaComplemento()
        {
            decimal compraComplemento = 0;
            decimal ventaComplemento = 0;

            if (decimal.TryParse(txtValorCompraComplemento.Text, out compraComplemento) && decimal.TryParse(txtValorVentaComplemento.Text, out ventaComplemento))
                txtRestaComplemento.Text = (compraComplemento - ventaComplemento).ToString("N3", Utilidades.Cultura);
            else
                txtRestaComplemento.Text = string.Empty;
        }

        private void CalcularComisionVendedor()
        {
            decimal valorVenta = 0;
            decimal valorComplementoVenta = 0;
            decimal comision = 0;

            decimal.TryParse(txtValorVentaComplemento.Text, out valorComplementoVenta);

            if (decimal.TryParse(txtValorVentaCompram2.Text, out valorVenta) && decimal.TryParse(txtComisionVendedor.Text, out comision))
                lblValorComision.Text = ((valorVenta + valorComplementoVenta) * (comision / 100)).ToString("N2", Utilidades.Cultura);
        }

        #endregion

        #region Cabecera

        private void CargarClientes()
        {
            BLLCliente bllClientes = new BLLCliente();

            cboCliente.Items.Clear();
            cboCliente.Items.Add("-- Seleccione Cliente --");

            foreach (Cliente clienteActual in bllClientes.TraerClientes().OrderBy(c => c.Nombre))
                cboCliente.Items.Add(clienteActual);

            cboCliente.SelectedIndex = 0;
        }

        private void CargarCondicionesVenta()
        {
            cboCondicionesVenta.Items.Clear();
            cboCondicionesVenta.Items.Insert(0, "--Seleccione una condición--");
            BLLCondicionVenta bll = new BLLCondicionVenta();

            foreach (CondicionVenta condicion in bll.TraerCondiciones().OrderBy(x => x.Nombre))
                cboCondicionesVenta.Items.Add(condicion);

            cboCondicionesVenta.SelectedIndex = 0;
        }

        private void CargarVendedores()
        {
            cboVendedores.Items.Clear();
            cboVendedores.Items.Add("-- Seleccione un vendedor --");

            BLLVendedor bllVendedor = new BLLVendedor();
            foreach (Vendedor vendedor in bllVendedor.TraerVendedores().OrderBy(v => v.Nombre).ToList())
                cboVendedores.Items.Add(vendedor);

            cboVendedores.SelectedIndex = 0;
        }

        private void cboCliente_SelectedIndexChanged(object sender, EventArgs e)
        {
            Cliente cliente = cboCliente.SelectedItem as Cliente;

            if (cliente == null)
            {
                txtCuit.Text = txtTelefono.Text = txtDomicilio.Text = string.Empty;
            }
            else
            {
                txtCuit.Text = cliente.Cuit;
                txtTelefono.Text = cliente.Telefono;
                txtLugarEntrega.Text = txtDomicilio.Text = cliente.Direccion;
            }

            ValidarSiSePuedeApretarElBotonParaVerLosPrecios();
        }

        private void btnABMClientes_Click(object sender, EventArgs e)
        {
            Utilidades.LanzarAbm<FrmClientes>(cboCliente, CargarClientes);
            CargarClientes();
        }

        private void btnABMCondicionesVenta_Click(object sender, EventArgs e)
        {
            Utilidades.LanzarAbm<FrmCondicionesDeVenta>(cboCondicionesVenta,CargarCondicionesVenta);
        }

        #endregion

        #region Datos de la Caja

        private void CargarModeloCajas()
        {
            BLLModeloCaja bllModeloCajas = new BLLModeloCaja();

            cboModeloCaja.Items.Clear();
            cboModeloCaja.Items.Add("-- Seleccione Modelo --");

            foreach (ModeloCaja modActual in bllModeloCajas.TraerModeloCajas().OrderBy(m => m.Codigo))
                cboModeloCaja.Items.Add(modActual);

            cboModeloCaja.SelectedIndex = 0;
        }

        private void ValidarSiSePuedeApretarElBotonParaVerLosPrecios()
        {
            btnVerHistoricoPrecios.Enabled = cboCliente.SelectedIndex > 0 && cboModeloCaja.SelectedIndex > 0;
        }

        private void cboModeloCaja_SelectedIndexChanged(object sender, EventArgs e)
        {
            ModeloCaja modelo = cboModeloCaja.SelectedItem as ModeloCaja;

            if (modelo == null)
                txtMedidasInteriores.Text = txtMedidasDeTrazado.Text = txtMedidasDePlancha.Text = string.Empty;
            else
            {
                txtMedidasInteriores.Text = modelo.MedidasInteriores;
                txtMedidasDeTrazado.Text = modelo.MedidasTrazado;
                txtMedidasDePlancha.Text = modelo.MedidasPlancha;
            }

            ValidarSiSePuedeApretarElBotonParaVerLosPrecios();
        }

        private void btnModelos_Click(object sender, EventArgs e)
        {
            Utilidades.LanzarAbm<FrmModeloCaja>(cboModeloCaja, CargarModeloCajas);
        }

        private void btnVerHistoricoPrecios_Click(object sender, EventArgs e)
        {
            Cliente cliente = cboCliente.SelectedItem as Cliente;
            ModeloCaja modelo = cboModeloCaja.SelectedItem as ModeloCaja;

            FrmHistorialPrecios frmPreciosCOnchaPuta = new FrmHistorialPrecios(cliente, modelo);
            frmPreciosCOnchaPuta.StartPosition = FormStartPosition.CenterScreen;
            if (frmPreciosCOnchaPuta.ShowDialog() == DialogResult.OK)
                txtCompraM2.Text = frmPreciosCOnchaPuta.PrecioSeleccionado.ToString("C2", Utilidades.Cultura);
        }

        #endregion

        #region Complementos

        private void btnVerDiseñoCaja_Click(object sender, EventArgs e)
        {
            FrmCaja frmCaja = new FrmCaja(_ordenCompleta.Diseño);

            if (frmCaja.ShowDialog() == DialogResult.OK)
            {
                _ordenCompleta.Diseño = frmCaja.DiseñoCaja;
                rdoUtilizarTextoPersonalizado.Checked = true;
            }
        }

        private void btnBuscarImagen_Click(object sender, EventArgs e)
        {
            if (ofdDiseñoFoto.ShowDialog() == DialogResult.OK)
            {
                picImagenDiseñoCaja.ImageLocation = ofdDiseñoFoto.FileName;
                rdoUtilizarImagen.Checked = true;
            }
        }

        #endregion

        #region Facturación Proveedores

        private decimal _totalAPagar;
        private decimal _totalPagado;

        private void CargarFacturacionProveedores()
        {
            dgvFacturasProveedores.DataSource = (from f in new BLLFactura().TraerFacturasProveedores(_ordenCompleta.Orden.IdOrden)
                                                select new
                                                {
                                                    IdFactura = f.Value.IdFactura,
                                                    Numero = f.Value.Numero,
                                                    Proveedor = new BLLProveedor().TraerProveedor(f.Key).RazonSocial,
                                                    Vencimiento = f.Value.FechaVencimiento.ToShortDateString(),
                                                    Importe = new BLLFactura().CalcularTotal(f.Value.IdFactura),
                                                    Estado = (f.Value.Pagada) ? "Pagada" : "Pendiente"
                                                }).ToList();
        }


        private void dgvFacturasProveedores_SelectionChanged(object sender, EventArgs e)
        {
            btnEditarFacturaProveedor.Enabled = btnRemoverFacturaProveedor.Enabled = dgvFacturasProveedores.SelectedRows.Count > 0;
        }

        private void btnAgregarFacturaProveedor_Click(object sender, EventArgs e)
        {
            FrmFactura frmNuevaFactura = new FrmFactura(true);
            frmNuevaFactura.StartPosition = FormStartPosition.CenterScreen;

            if (frmNuevaFactura.ShowDialog() == DialogResult.OK)
            {
                BLLFactura bllFactura = new BLLFactura();
                bllFactura.CargarFactura(frmNuevaFactura.Factura, frmNuevaFactura.Detalles, frmNuevaFactura.Cheques, _ordenCompleta.Orden.IdOrden, frmNuevaFactura.Proveedor);
                CargarFacturacionProveedores();
            }
        }

        private void btnRemoverFacturaProveedor_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("¿Eliminar factura?", "Pregunta", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No)
                return;

            int idFactura = (int) dgvFacturasProveedores.SelectedRows[0].Cells[0].Value;
            BLLFactura bllFactura = new BLLFactura();
            bllFactura.EliminarFactura(idFactura);
            CargarFacturacionProveedores();
        }

        private void btnEditarFacturaProveedor_Click(object sender, EventArgs e)
        {
            if (dgvFacturasProveedores.SelectedRows.Count == 0)
                return;

            int idFactura = (int)dgvFacturasProveedores.SelectedRows[0].Cells[0].Value;
            FrmFactura frmFactura = new FrmFactura(idFactura);
            if (frmFactura.ShowDialog() == DialogResult.OK)
            {
                BLLFactura bllFactura = new BLLFactura();
                bllFactura.ModificarFactura(frmFactura.Factura, frmFactura.Detalles, frmFactura.Cheques, frmFactura.Proveedor);
                CargarFacturacionProveedores();
            }
        }

        private void btnActualizarDeudaProveedores_Click(object sender, EventArgs e)
        {
            if (bgwCalcularDeudaProveedores.IsBusy)
                return;

            picCargandoDeudaProveedores.Visible = true;
            gbFacturasProveedores.Enabled = false;
            bgwCalcularDeudaProveedores.RunWorkerAsync();
        }

        private void bgwCalcularDeudaProveedores_DoWork(object sender, DoWorkEventArgs e)
        {
            _totalAPagar = _totalPagado = 0;

            foreach (KeyValuePair<int, Factura> item in new BLLFactura().TraerFacturasProveedores(_ordenCompleta.Orden.IdOrden))
            {
                decimal total = new BLLFactura().CalcularTotal(item.Value.IdFactura);
                _totalAPagar += total;

                if (item.Value.Pagada)
                    _totalPagado += total;
            }
        }

        private void bgwCalcularDeudaProveedores_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Error != null)
            {
                MessageBox.Show(e.Error.Message, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            picCargandoDeudaProveedores.Visible = false;
            gbFacturasProveedores.Enabled = true;
            txtTotalAPagar.Text = "$" + _totalAPagar.ToString("N2");
            txtPagado.Text = "$" + _totalPagado.ToString("N2");
            txtDeuda.Text = "$" + (_totalAPagar - _totalPagado).ToString("N2");
        }

        #endregion

        #region Facturacion Clientes

        private decimal _totalACobrar;
        private decimal _totalCobrado;

        private void CargarFacturacionCliente()
        {
            dgvFacturasCliente.DataSource = (from f in new BLLFactura().TraerFacturasCliente(_ordenCompleta.Orden.IdOrden)
                                             select new
                                             {
                                                 IdFactura = f.IdFactura,
                                                 Numero = f.Numero,
                                                 Vencimiento = f.FechaVencimiento.ToShortDateString(),
                                                 Importe = new BLLFactura().CalcularTotal(f.IdFactura),
                                                 Estado = (f.Pagada) ? "Pagada" : "Pendiente"
                                             }).ToList();
        }


        private void dgvFacturasCliente_SelectionChanged(object sender, EventArgs e)
        {
            btnRemoverFacturaCliente.Enabled = btnEditarFacturaCliente.Enabled = dgvFacturasCliente.SelectedRows.Count > 0;
        }

        private void btnAgregarFacturaCliente_Click(object sender, EventArgs e)
        {
            FrmFactura frmNuevaFactura = new FrmFactura(false);
            frmNuevaFactura.StartPosition = FormStartPosition.CenterScreen;

            if (frmNuevaFactura.ShowDialog() == DialogResult.OK)
            {
                BLLFactura bllFactura = new BLLFactura();
                bllFactura.CargarFactura(frmNuevaFactura.Factura, frmNuevaFactura.Detalles, frmNuevaFactura.Cheques, _ordenCompleta.Orden.IdOrden);
                CargarFacturacionCliente();
            }
        }

        private void btnRemoverFacturaCliente_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("¿Eliminar factura?", "Pregunta", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No)
                return;

            int idFactura = (int)dgvFacturasCliente.SelectedRows[0].Cells[0].Value;
            BLLFactura bllFactura = new BLLFactura();
            bllFactura.EliminarFactura(idFactura);

            CargarFacturacionCliente();
        }

        private void btnEditarFacturaCliente_Click(object sender, EventArgs e)
        {
            if (dgvFacturasCliente.SelectedRows.Count == 0)
                return;

            int idFactura = (int)dgvFacturasCliente.SelectedRows[0].Cells[0].Value;
            FrmFactura frmFactura = new FrmFactura(idFactura);
            if (frmFactura.ShowDialog() == DialogResult.OK)
            {
                BLLFactura bllFactura = new BLLFactura();
                bllFactura.ModificarFactura(frmFactura.Factura, frmFactura.Detalles, frmFactura.Cheques);
                CargarFacturacionCliente();
            }
        }

        private void btnCalcularFacturacionCliente_Click(object sender, EventArgs e)
        {
            if (bgwCalcularDeudaCliente.IsBusy)
                return;

            picCargandoFacturacionCliente.Visible = true;
            gbFacturasCliente.Enabled = false;
            bgwCalcularDeudaCliente.RunWorkerAsync();
        }

        private void bgwCalcularDeudaCliente_DoWork(object sender, DoWorkEventArgs e)
        {
            _totalACobrar = _totalCobrado = 0;

            foreach (Factura item in new BLLFactura().TraerFacturasCliente(_ordenCompleta.Orden.IdOrden))
            {
                _totalACobrar += new BLLFactura().CalcularTotal(item.IdFactura);

                if(item.Pagada)
                    _totalCobrado += new BLLFactura().CalcularTotal(item.IdFactura);
            }
        }

        private void bgwCalcularDeudaCliente_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Error != null)
            {
                MessageBox.Show(e.Error.Message, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            picCargandoFacturacionCliente.Visible = false;
            gbFacturasCliente.Enabled = true;
            txtTotalACobrar.Text = "$" + _totalACobrar.ToString("N2");
            txtCobrado.Text = "$" + _totalCobrado.ToString("N2");
            txtDeudaCobrar.Text = "$" + (_totalACobrar - _totalCobrado).ToString("N2");
        }

        #endregion

        private void btnABMVendedores_Click(object sender, EventArgs e)
        {
            Utilidades.LanzarAbm<FrmVendedor>(cboVendedores, CargarVendedores);
        }

        private void btnImprimir_Click(object sender, EventArgs e)
        {
            ActualizarCalculos(this, e);
            BLLOrden bllOrden = new BLLOrden();
            LeerDatosOrden(bllOrden);

            Cliente cliente = (cboCliente.SelectedItem as Cliente);
            if (cliente == null)
                MessageBox.Show("Debe seleccionar un cliente", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);

            OrdenReporte reporte = new OrdenReporte();
            reporte.Fecha = _ordenCompleta.Orden.Fecha.ToShortDateString();
            reporte.LugarEntrega = _ordenCompleta.Orden.LugarEntrega;
            reporte.Cliente = cliente.Nombre;
            reporte.CUIT = cliente.Cuit;
            reporte.DomicilioTelefono = cliente.Direccion + " - " + cliente.Telefono;

            ModeloCaja modelo = (cboModeloCaja.SelectedItem as ModeloCaja);
            if (modelo == null)
                MessageBox.Show("Debe seleccionar un modelo", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);

            reporte.Modelo = modelo.Codigo;
            reporte.OrdenCompra = _ordenCompleta.Caja.OrdenCompra;
            reporte.CajaPara = _ordenCompleta.Caja.CajaPara;
            reporte.Material = modelo.Libraje;
            reporte.Formato = _ordenCompleta.Caja.Formato;
            reporte.Colores = _ordenCompleta.Caja.Colores;
            reporte.MedidasPlancha = modelo.MedidasPlancha;
            reporte.MedidasTrazado = modelo.MedidasTrazado;
            reporte.Cantidad = _ordenCompleta.Caja.Cantidad;
            reporte.Superficie = double.Parse(txtSuperficie.Text);
            reporte.Clise = _ordenCompleta.Caja.Clise;
            reporte.Precio = _ordenCompleta.Caja.Precio;

            CondicionVenta condicionVenta = (cboCondicionesVenta.SelectedItem as CondicionVenta);
            if (condicionVenta == null)
                MessageBox.Show("Debe seleccionar una condición de venta", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);

            reporte.CantidadComplemento = _ordenCompleta.Complementos.CercosCantidad + _ordenCompleta.Complementos.DivisionesCantidad + _ordenCompleta.Complementos.PisosCantidad;
            reporte.Precio = decimal.Parse(txtPrecioVtaM2.Text);
            reporte.PisosCantidad = _ordenCompleta.Complementos.PisosCantidad;
            reporte.PisosPrecio = _ordenCompleta.Complementos.PisosPrecio;
            reporte.PisosSuperficie = _ordenCompleta.Complementos.PisosSuperficie;
            reporte.CercosCantidad = _ordenCompleta.Complementos.CercosCantidad;
            reporte.CercosPrecio = _ordenCompleta.Complementos.CercosPrecio;
            reporte.CercosSuperficie = _ordenCompleta.Complementos.CercosSuperficie;
            reporte.DivisionesCantidad = _ordenCompleta.Complementos.DivisionesCantidad;
            reporte.DivisionesPrecio = _ordenCompleta.Complementos.DivisionesPrecio;
            reporte.DivisionesSuperficie = _ordenCompleta.Complementos.DivisionesSuperficie;
            reporte.CondicionesVenta = condicionVenta.Nombre;
            reporte.CPlancha = txtCPlancha.Text;

            Vendedor vendedor = (cboVendedores.SelectedItem as Vendedor);
            if (condicionVenta == null)
                MessageBox.Show("Debe seleccionar un vendedor", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);

            reporte.CompraM2 = _ordenCompleta.Orden.CompraM2;
            reporte.ValorCompra = decimal.Parse(txtValorCompram2.Text);
            reporte.ValorVenta = decimal.Parse(txtValorVentaCompram2.Text);
            reporte.Vendedor = vendedor.Nombre;
            reporte.Observaciones = _ordenCompleta.Caja.Observaciones;

            reporte.AletaArriba1 = _ordenCompleta.Diseño.AletaArriba1;
            reporte.AletaArriba2 = _ordenCompleta.Diseño.AletaArriba2;
            reporte.AletaArriba3 = _ordenCompleta.Diseño.AletaArriba3;
            reporte.AletaArriba4 = _ordenCompleta.Diseño.AletaArriba4;
            reporte.AletaAbajo1 = _ordenCompleta.Diseño.AletaAbajo1;
            reporte.AletaAbajo2 = _ordenCompleta.Diseño.AletaAbajo2;
            reporte.AletaAbajo3 = _ordenCompleta.Diseño.AletaAbajo3;
            reporte.AletaAbajo4 = _ordenCompleta.Diseño.AletaAbajo4;

            reporte.ContenidoArriba1 = _ordenCompleta.Diseño.ContenidoArriba1;
            reporte.Contenido1 = _ordenCompleta.Diseño.Contenido1;
            reporte.ContenidoAbajo1 = _ordenCompleta.Diseño.ContenidoAbajo1;
            reporte.ContenidoArriba2 = _ordenCompleta.Diseño.ContenidoArriba2;
            reporte.Contenido2 = _ordenCompleta.Diseño.Contenido2;
            reporte.ContenidoAbajo2 = _ordenCompleta.Diseño.ContenidoAbajo2;

            reporte.LeyendaArriba1 = _ordenCompleta.Diseño.LeyendaArriba1;
            reporte.Leyenda1 = _ordenCompleta.Diseño.Leyenda1;
            reporte.LeyendaAbajo1 = _ordenCompleta.Diseño.LeyendaAbajo1;
            reporte.LeyendaArriba2 = _ordenCompleta.Diseño.LeyendaArriba2;
            reporte.Leyenda2 = _ordenCompleta.Diseño.Leyenda2;
            reporte.LeyendaAbajo2 = _ordenCompleta.Diseño.LeyendaAbajo2;

            if (_ordenCompleta.Diseño.ArchivoFoto != null)
            {
                Image img = Image.FromFile( new BLLOrden().CarpetaFotos + _ordenCompleta.Diseño.ArchivoFoto);
                reporte.ArchivoFoto = Utilidades.imageToByteArray(img);
            }

            FrmReporteVistaPrevia frmReporte = new FrmReporteVistaPrevia(reporte);
            frmReporte.StartPosition = FormStartPosition.CenterScreen;
            frmReporte.MdiParent = this.MdiParent;
            frmReporte.Show();
        }
    }
}
